summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt129
1 files changed, 49 insertions, 80 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
index 76accf8f3..15ae3a42b 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/DriverViewModel.kt
@@ -9,6 +9,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
@@ -17,11 +18,10 @@ import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.YuzuApplication
import org.yuzu.yuzu_emu.features.settings.model.StringSetting
import org.yuzu.yuzu_emu.features.settings.utils.SettingsFile
-import org.yuzu.yuzu_emu.utils.FileUtil
+import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
import org.yuzu.yuzu_emu.utils.NativeConfig
-import java.io.BufferedOutputStream
import java.io.File
class DriverViewModel : ViewModel() {
@@ -38,97 +38,81 @@ class DriverViewModel : ViewModel() {
!loading && ready && !deleting
}.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), initialValue = false)
- private val _driverList = MutableStateFlow(GpuDriverHelper.getDrivers())
- val driverList: StateFlow<MutableList<Pair<String, GpuDriverMetadata>>> get() = _driverList
+ var driverData = GpuDriverHelper.getDrivers()
- var previouslySelectedDriver = 0
- var selectedDriver = -1
+ private val _driverList = MutableStateFlow(emptyList<Driver>())
+ val driverList: StateFlow<List<Driver>> get() = _driverList
// Used for showing which driver is currently installed within the driver manager card
private val _selectedDriverTitle = MutableStateFlow("")
val selectedDriverTitle: StateFlow<String> get() = _selectedDriverTitle
- private val _newDriverInstalled = MutableStateFlow(false)
- val newDriverInstalled: StateFlow<Boolean> get() = _newDriverInstalled
+ private val _showClearButton = MutableStateFlow(false)
+ val showClearButton = _showClearButton.asStateFlow()
- val driversToDelete = mutableListOf<String>()
+ private val driversToDelete = mutableListOf<String>()
init {
- val currentDriverMetadata = GpuDriverHelper.installedCustomDriverData
- findSelectedDriver(currentDriverMetadata)
-
- // If a user had installed a driver before the manager was implemented, this zips
- // the installed driver to UserData/gpu_drivers/CustomDriver.zip so that it can
- // be indexed and exported as expected.
- if (selectedDriver == -1) {
- val driverToSave =
- File(GpuDriverHelper.driverStoragePath, "CustomDriver.zip")
- driverToSave.createNewFile()
- FileUtil.zipFromInternalStorage(
- File(GpuDriverHelper.driverInstallationPath!!),
- GpuDriverHelper.driverInstallationPath!!,
- BufferedOutputStream(driverToSave.outputStream())
- )
- _driverList.value.add(Pair(driverToSave.path, currentDriverMetadata))
- setSelectedDriverIndex(_driverList.value.size - 1)
- }
+ updateDriverList()
+ updateDriverNameForGame(null)
+ }
- // If a user had installed a driver before the config was reworked to be multiplatform,
- // we have save the path of the previously selected driver to the new setting.
- if (StringSetting.DRIVER_PATH.getString(true).isEmpty() && selectedDriver > 0 &&
- StringSetting.DRIVER_PATH.global
- ) {
- StringSetting.DRIVER_PATH.setString(_driverList.value[selectedDriver].first)
- NativeConfig.saveGlobalConfig()
- } else {
- findSelectedDriver(GpuDriverHelper.customDriverSettingData)
+ fun reloadDriverData() {
+ _areDriversLoading.value = true
+ driverData = GpuDriverHelper.getDrivers()
+ updateDriverList()
+ _areDriversLoading.value = false
+ }
+
+ fun updateDriverList() {
+ val selectedDriver = GpuDriverHelper.customDriverSettingData
+ val newDriverList = mutableListOf(
+ Driver(
+ selectedDriver == GpuDriverMetadata(),
+ YuzuApplication.appContext.getString(R.string.system_gpu_driver)
+ )
+ )
+ driverData.forEach {
+ newDriverList.add(it.second.toDriver(it.second == selectedDriver))
}
- updateDriverNameForGame(null)
+ _driverList.value = newDriverList
}
- fun setSelectedDriverIndex(value: Int) {
- if (selectedDriver != -1) {
- previouslySelectedDriver = selectedDriver
+ fun onOpenDriverManager(game: Game?) {
+ if (game != null) {
+ SettingsFile.loadCustomConfig(game)
}
- selectedDriver = value
+ updateDriverList()
}
- fun setNewDriverInstalled(value: Boolean) {
- _newDriverInstalled.value = value
+ fun showClearButton(value: Boolean) {
+ _showClearButton.value = value
}
- fun addDriver(driverData: Pair<String, GpuDriverMetadata>) {
- val driverIndex = _driverList.value.indexOfFirst { it == driverData }
- if (driverIndex == -1) {
- _driverList.value.add(driverData)
- setSelectedDriverIndex(_driverList.value.size - 1)
- _selectedDriverTitle.value = driverData.second.name
- ?: YuzuApplication.appContext.getString(R.string.system_gpu_driver)
+ fun onDriverSelected(position: Int) {
+ if (position == 0) {
+ StringSetting.DRIVER_PATH.setString("")
} else {
- setSelectedDriverIndex(driverIndex)
+ StringSetting.DRIVER_PATH.setString(driverData[position - 1].first)
}
}
- fun removeDriver(driverData: Pair<String, GpuDriverMetadata>) {
- _driverList.value.remove(driverData)
+ fun onDriverRemoved(removedPosition: Int, selectedPosition: Int) {
+ driversToDelete.add(driverData[removedPosition - 1].first)
+ driverData.removeAt(removedPosition - 1)
+ onDriverSelected(selectedPosition)
}
- fun onOpenDriverManager(game: Game?) {
- if (game != null) {
- SettingsFile.loadCustomConfig(game)
- }
-
- val driverPath = StringSetting.DRIVER_PATH.getString()
- if (driverPath.isEmpty()) {
- setSelectedDriverIndex(0)
- } else {
- findSelectedDriver(GpuDriverHelper.getMetadataFromZip(File(driverPath)))
+ fun onDriverAdded(driver: Pair<String, GpuDriverMetadata>) {
+ if (driversToDelete.contains(driver.first)) {
+ driversToDelete.remove(driver.first)
}
+ driverData.add(driver)
+ onDriverSelected(driverData.size)
}
fun onCloseDriverManager(game: Game?) {
_isDeletingDrivers.value = true
- StringSetting.DRIVER_PATH.setString(driverList.value[selectedDriver].first)
updateDriverNameForGame(game)
if (game == null) {
NativeConfig.saveGlobalConfig()
@@ -181,20 +165,6 @@ class DriverViewModel : ViewModel() {
}
}
- private fun findSelectedDriver(currentDriverMetadata: GpuDriverMetadata) {
- if (driverList.value.size == 1) {
- setSelectedDriverIndex(0)
- return
- }
-
- driverList.value.forEachIndexed { i: Int, driver: Pair<String, GpuDriverMetadata> ->
- if (driver.second == currentDriverMetadata) {
- setSelectedDriverIndex(i)
- return
- }
- }
- }
-
fun updateDriverNameForGame(game: Game?) {
if (!GpuDriverHelper.supportsCustomDriverLoading()) {
return
@@ -217,7 +187,6 @@ class DriverViewModel : ViewModel() {
private fun setDriverReady() {
_isDriverReady.value = true
- _selectedDriverTitle.value = GpuDriverHelper.customDriverSettingData.name
- ?: YuzuApplication.appContext.getString(R.string.system_gpu_driver)
+ updateName()
}
}